import { UNIT_CATEGORY } from "../attr/EnumAttr";

// 技能配置接口
export interface ISkillConfig {
    id: number;                      // 技能ID
    name: string;                    // 技能名称
    icon: string;                    // 技能图标
    description: string;             // 技能描述
    skillType: SkillType;            // 技能类型
    
    // 释放设置
    castType: CastType;              // 释放类型
    targetType: TargetType;          // 目标类型
    castRange: number;               // 释放范围
    castTime: number;                // 释放时间
    cooldown: number;                // 冷却时间
    energyCost: number;              // 能量消耗
    
    // 作用范围
    areaType: AreaType;              // 范围类型
    areaSize: number[];              // 范围大小[width, height]
    areaOffset: number[];            // 范围偏移[x, y]
    
    // 目标限制
    maxTargets: number;              // 最大目标数
    targetCategories: UNIT_CATEGORY[]; // 可选目标类别
    
    // 效果设置
    effects: ISkillEffectConfig[];   // 效果列表
    
    // 视觉表现
    visualFX: {
        castFX?: string;             // 释放特效
        projectileFX?: string;       // 投射物特效
        impactFX?: string;           // 命中特效
        soundFX?: string;            // 音效
    };
    
    // 动画设置
    animation: {
        castAnim?: string;           // 释放动画
        loopAnim?: string;           // 循环动画
        endAnim?: string;            // 结束动画
    };
    
    // 技能链设置
    chainSkill?: {
        nextSkillId?: number;        // 下一个技能ID
        chainDelay?: number;         // 链接延迟
        condition?: SkillChainCondition; // 链接条件
    };
    
    // 升级设置
    upgrades?: {
        level: number;               // 升级等级
        cooldownReduction?: number;  // 冷却减少
        damageIncrease?: number;     // 伤害增加
        rangeIncrease?: number;      // 范围增加
        extraEffects?: number[];     // 额外效果
    }[];
}

// 技能效果配置
export interface ISkillEffectConfig {
    effectType: SkillEffectType;     // 效果类型
    timing: EffectTiming;            // 效果触发时机
    chance: number;                  // 触发几率(0-1)
    values: number[];                // 效果数值
    
    // 伤害/治疗相关
    damageType?: DamageType;         // 伤害类型
    damageAttribute?: number;        // 伤害属性
    damageFormula?: string;          // 伤害公式
    
    // Buff相关
    buffId?: number;                 // BuffID
    buffDuration?: number;           // Buff持续时间
    buffStacks?: number;             // Buff叠加层数
    
    // 召唤相关
    summonId?: number;               // 召唤物ID
    summonCount?: number;            // 召唤数量
    summonDuration?: number;         // 召唤持续时间
    
    // 条件相关
    condition?: {
        type: ConditionType;         // 条件类型
        params: any[];               // 条件参数
    };
}

// 技能类型枚举
export enum SkillType {
    ACTIVE = 0,       // 主动技能
    PASSIVE = 1,      // 被动技能
    TRIGGERED = 2,    // 触发技能
    WEAPON = 3,       // 武器技能
    TOWER = 4,        // 塔技能
}

// 释放类型枚举
export enum CastType {
    INSTANT = 0,      // 瞬发
    CHANNELED = 1,    // 引导
    CHARGED = 2,      // 蓄力
    TOGGLE = 3,       // 开关
}

// 目标类型枚举
export enum TargetType {
    NONE = 0,         // 无目标
    SELF = 1,         // 自身
    SINGLE = 2,       // 单体目标
    POINT = 3,        // 指定点
    DIRECTION = 4,    // 指定方向
}

// 范围类型枚举
export enum AreaType {
    NONE = 0,         // 无范围
    CIRCLE = 1,       // 圆形
    RECTANGLE = 2,    // 矩形
    SECTOR = 3,       // 扇形
    LINE = 4,         // 直线
    CROSS = 5,        // 十字
}

// 效果类型枚举
export enum SkillEffectType {
    DAMAGE = 0,           // 伤害
    HEAL = 1,             // 治疗
    BUFF = 2,             // Buff
    DEBUFF = 3,           // Debuff
    SUMMON = 4,           // 召唤
    TELEPORT = 5,         // 传送
    KNOCKBACK = 6,        // 击退
    PULL = 7,             // 拉近
    STUN = 8,             // 眩晕
    SLOW = 9,             // 减速
    PROJECTILE = 10,      // 发射投射物
    ATTRIBUTE_MODIFY = 11, // 属性修改
    SHIELD = 12,          // 护盾
}

// 效果触发时机枚举
export enum EffectTiming {
    ON_CAST = 0,          // 释放时
    ON_HIT = 1,           // 命中时
    ON_PERIOD = 2,        // 周期性
    ON_END = 3,           // 结束时
    ON_KILL = 4,          // 击杀时
    ON_CRIT = 5,          // 暴击时
}

// 伤害类型枚举
export enum DamageType {
    PHYSICAL = 0,         // 物理伤害
    MAGICAL = 1,          // 魔法伤害
    TRUE = 2,             // 真实伤害
    FIRE = 3,             // 火焰伤害
    ICE = 4,              // 冰冻伤害
    LIGHTNING = 5,        // 雷电伤害
    POISON = 6,           // 毒素伤害
    WIND = 7,             // 风系伤害
}

// 技能链接条件枚举
export enum SkillChainCondition {
    NONE = 0,             // 无条件
    ON_HIT = 1,           // 命中时
    ON_CRIT = 2,          // 暴击时
    ON_KILL = 3,          // 击杀时
    TARGET_HP_BELOW = 4,  // 目标生命低于
    SELF_HP_BELOW = 5,    // 自身生命低于
}

// 条件类型枚举
export enum ConditionType {
    NONE = 0,             // 无条件
    TARGET_HP_PERCENT = 1, // 目标生命百分比
    SELF_HP_PERCENT = 2,   // 自身生命百分比
    TARGET_COUNT = 3,      // 目标数量
    HAS_BUFF = 4,          // 拥有Buff
    TARGET_DISTANCE = 5,   // 目标距离
}

// 技能配置管理器
export class SkillConfigManager {
    private static _instance: SkillConfigManager;
    
    private _skillConfigs: Map<number, ISkillConfig> = new Map();
    
    private constructor() {
        // 初始化逻辑
    }
    
    public static get instance(): SkillConfigManager {
        if (!this._instance) {
            this._instance = new SkillConfigManager();
        }
        return this._instance;
    }
    
    // 加载技能配置
    public loadSkillConfigs(configs: any[]): void {
        configs.forEach(config => {
            this._skillConfigs.set(config.id, config);
        });
    }
    
    // 获取技能配置
    public getSkillConfig(id: number): ISkillConfig {
        return this._skillConfigs.get(id);
    }
    
    // 获取技能类别的配置
    public getSkillsByType(type: SkillType): ISkillConfig[] {
        const result: ISkillConfig[] = [];
        this._skillConfigs.forEach(config => {
            if (config.skillType === type) {
                result.push(config);
            }
        });
        return result;
    }
    
    // 获取实体可用的技能配置
    public getSkillsForEntity(entityId: number, category: UNIT_CATEGORY): ISkillConfig[] {
        const result: ISkillConfig[] = [];
        // 实现获取实体可用技能的逻辑
        // 可能需要查询实体配置或其他数据
        return result;
    }
} 